//
// Created by tcj on 2022/7/16.
//

#ifndef WEB_TEST_HTTPCONNECTION_H
#define WEB_TEST_HTTPCONNECTION_H

/*
 * 对一个http链接的抽象，负责对一个http请求的解析和回复，以及提供读写的接口
 * 读写接口的底层就是靠buffer缓冲区来实现的，这个缓冲区提供了读写的接口。
 * 但是写接口用了分散的方式取实现。
 * 然后就是对socket链接中读取的数据进行解析，以及对请求做出相应，这部分的实现就是依赖于HTTPRequest和HTTPresponse实现
 *
 * */
#include "arpa/inet.h"
#include "HTTPrequest.h"
#include "iostream"
#include "HTTPresponse.h"

namespace tcj{
    class HTTPconnection {
    public:
        HTTPconnection();
        ~HTTPconnection();

        void initHttpConn(int socketFd,const sockaddr_in& addr);

        size_t readBuffer(int* saveErrno);
        size_t writeBuffer(int* saveErrno);

        void closeHttpConn();
        bool handleHttpConn();

        const char* getIP() const;
        int getPort() const;
        int getFd() const;
        sockaddr_in getAddr() const;

        int writeBytes(){
            return iov_[1].iov_len + iov_[0].iov_len;
        }

        bool isKeepLive() const {
            return request_.isKeepAlive();
        }

        static bool isET;
        static const char* srcDir;          // 根目录
        static std::atomic<int> userCount;  // http连接的个数
    private:
        int fd_;                    // http连接对应的文件描述符
        struct sockaddr_in addr_;   //
        bool isCLose_;              // 标记是否关闭连接

        int iovCnt_;                //
//        struct iovec {
//            ptr_t iov_base; /* Starting address */
//            size_t iov_len; /* Length in bytes */
//        };
        struct iovec iov_[2];
        Buffer readBuffer_;         // 读缓冲区
        Buffer writeBuffer_;        // 写缓冲区

        HTTPrequest request_;
        HTTPresponse response_;

    };

}


#endif //WEB_TEST_HTTPCONNECTION_H
